Problem Description
给你一个5*5的二维数组,表示一个迷宫,0可以走,1不可以走,问你从左上角到右下角,最短的路径,保证数据有唯一的解。
代码:BFS从左上角跑到右下角就好了,没跑到一个点记录,是那个点到的这个点。后面翻转下路径输出就可以了
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
struct node
{
int ii, jj;
};
int Map[10][10], vis[10][10];//迷宫,标记数组
node Pre[10][10];//记录路径
queue<node> q;
vector<node> a;//记录结果路径用的
int x[5] = {1, 0, -1, 0};
int y[5] = {0, 1, 0, -1};
int judge(int xx, int yy)
{
if(xx >= 0 && yy >= 0 && xx < 5 && yy < 5 && !vis[xx][yy] && Map[xx][yy] == 0) return 1;
else return 0;
}
void Bfs(int u, int v)
{
int i;
memset(vis, 0, sizeof(vis));
while(!q.empty()) q.pop();//初始化队列
q.push((node){u, v});//入队列最开始0,0点
vis[u][v] = 1;//标记一下已经走过&&记录路径
node t;
int xx, yy;
while(!q.empty())
{
t = q.front();
q.pop();
if(t.ii == 4 && t.jj == 4)//到达终点
{
a.push_back((node){t.ii, t.jj});//记录路径
while(t.ii || t.jj)//直到起点退出循环
{
xx = t.ii, yy = t.jj;
a.push_back((node){Pre[xx][yy].ii, Pre[xx][yy].jj});//存入上一点
t.ii = Pre[xx][yy].ii; t.jj = Pre[xx][yy].jj;
}
for(i = a.size() - 1; i >= 0; i--)//反向输出
{
printf("(%d, %d)\n", a[i].ii, a[i].jj);
}
return ;
}
for(i = 0; i < 4; i++)//上下左右的走
{
xx = t.ii + x[i];
yy = t.jj + y[i];
if(judge(xx, yy))//判断下一步可以走
{
vis[xx][yy] = vis[t.ii][t.jj] + 1;//路径++
Pre[xx][yy] = (node){t.ii, t.jj};//记录好那一点到的这一点
q.push((node){xx, yy});//入队列
}
}
}
}
int main()
{
int i, j;
for(i = 0; i < 5; i++)
{
for(j = 0; j < 5; j++)
scanf("%d", &Map[i][j]);
}
Bfs(0, 0);//最开始0,0点
a.clear();
return 0;
}